C语言解决"约瑟夫问题"

来源:百度知道 编辑:UC知道 时间:2024/05/21 18:52:28
n个人编号坐成一圈,从1号开始报数,报到m的出列,下一位继续报1,直到只剩一人,求最后一人的编号.
请用C语言写.
要求用链表

#include<stdio.h>
struct list//建立一个结构体,包括每个人的编号,密码和下一级的指针
{
int id;
struct list *next;
};
list* input(int n)//链表的初始化
{
list *p,*q,*l;
int i,m;
p=new list;
l=new list;
l->next=NULL;
p=l;
p->id=1;//第一个人的初始化
for(i=2;i<=n;i++)//第二个人到第num个人的初始化
{
q=new list;
q->id=i;
q->next=NULL;
p->next=q;
p=q;
}
p->next=l;//使表尾指向表头,成循环链表
return p;
}
int main()
{
int num,m1,i;
list *q,*p;
printf("输入人数:");
while(scanf("%d",&num)!=EOF)
{
printf("密码为:");
scanf("%d",&m1);
p=input(num);
printf("最后一人序号为:");
while(p->next!=p)
{
for(i=1;i<=m1;i++)
{
q=p;
p=p->next;
}
q->next=p->next;
del